/*
 * Copyright (C) 2008 Alessandro Sivieri <alessandro.sivieri@chimera-bellerofonte.eu>.
 *
 *  This file is part of Daex.
 *
 *  Daex is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  Foobar is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
 */
package eu.chimera_bellerofonte.tesi.encoding;

import java.beans.PropertyChangeListener;


/**
 * Interfaccia di definizione del metodo di esecuzione
 * dell'encoding; richiede anche un qualche tipo di implementazione
 * che gestisca alcuni metodi PropertyChangeListener che aggancino
 * ed avvertano i cambiamenti nello stato dell'esecutore.
 * 
 * @see java.beans.PropertyChangeListener
 * @author Sivieri Alessandro
 * @author Vitucci Nicola
 * @version 20/apr/07
 */
public interface EncoderExecutor
{
	/**
	 * Nome della proprieta' che indica l'esecuzione.
	 */
	public static final String EXECPROPERTY="execution";
	/**
	 * Nome della proprieta' che indica il termine di una
	 * traccia.
	 */
	public static final String EXECPARTIAL="partialdone";
	/**
	 * Nome della proprieta' che indica il termine dell'ultima
	 * traccia.
	 */
	public static final String EXECLASTPARTIAL="lastpartialdone";
	/**
	 * Nome della proprieta' che riporta lo stato del progresso
	 * di avanzamento, normalizzato a 100.
	 * Il valore "old" di questa proprieta' non ha alcun significato.
	 */
	public static final String PROGRESSION="progression";
	/**
	 * Nome della proprieta' che riporta l'output ottenuto dall'esecuzione
	 * del programma esterno.
	 * Il valore "old" di questa proprieta' non ha alcun significato.
	 */
	public static final String EXECOUTPUT="execoutput";
	/**
	 * Nome della proprieta' indicizzata che contiene l'operazione
	 * in corso per la riga indicata.
	 * Il valore "old" di questa proprieta' non ha alcun significato.
	 */
	public static final String PARTIALOP="partialop";
	
	/**
	 * Metodo per iniziare la codifica delle tracce secondo
	 * le specifiche date.
	 * @throws ProgramNotFoundException eccezione lanciata in cso di problemi di creazione
	 */
	public void encode() throws ProgramNotFoundException;
	
	/**
	 * Metodo per interrompere il flusso di esecuzione.
	 */
	public void interrupt();
	
	/**
	 * @see java.beans.PropertyChangeSupport#addPropertyChangeListener(PropertyChangeListener)
	 */
	public void addPropertyChangeListener(PropertyChangeListener listener);
	
	/**
	 * @see java.beans.PropertyChangeSupport#addPropertyChangeListener(String, PropertyChangeListener)
	 */
	public void addPropertyChangeListener(String property, PropertyChangeListener listener);
	
	/**
	 * @see java.beans.PropertyChangeSupport#getPropertyChangeListeners()
	 */
	public PropertyChangeListener[] getPropertyChangeListeners();
	
	/**
	 * @see java.beans.PropertyChangeSupport#getPropertyChangeListeners(String)
	 */
	public PropertyChangeListener[] getPropertyChangeListeners(String property);
	
	/**
	 * @see java.beans.PropertyChangeSupport#removePropertyChangeListener(PropertyChangeListener)
	 */
	public void removePropertyChangeListener(PropertyChangeListener listener);
	
	/**
	 * @see java.beans.PropertyChangeSupport#removePropertyChangeListener(String, PropertyChangeListener)
	 */
	public void removePropertyChangeListener(String property, PropertyChangeListener listener);
	
	/**
	 * Metodo che informa se la classe e' in fase di codifica.
	 * 
	 * @return true se codifica, false altrimenti
	 */
	public boolean isEncoding();
	
}
